#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h> // file option
#include <dirent.h>
#include <pthread.h>
// #include <iostream>
// #include <sstream>
// #include <vector>
// #include <list>
// #include <map>
// #include <thread>
// #include <string>
// #include <iomanip>
// #include <fstream>
// #include <vector>
// #include <set>
// #include <algorithm>
// #include <unordered_map>
// #include <mutex>
// #include <atomic>
// #include <bits/wordsize.h>
// #include <bits/timesize.h>
using namespace std;
#include <stdarg.h>

pthread_mutex_t globMut;
static int globVal = 0;
//锁需要提示的是：如果lock后，没有unlock会造成锁死。
//比如 lock;if(x){return;}unlock;就有风险。
void *threadTest(void *data)
{
    sleep(1);
    pthread_mutex_lock(&globMut);
    globVal = 2;
    pthread_mutex_unlock(&globMut);
    printf("g1\n");
    while(globVal == 2)
    {
        usleep(1000);
    }
    printf("g2\n");
    pthread_mutex_lock(&globMut);
    globVal = 4;
    pthread_mutex_unlock(&globMut);
    sleep(1);
    printf("g3\n");
    return NULL;
}

int main()
{
    pthread_t tmpfd;
    // pthread_attr_t tmpattr;//线程属性，可以配置优先级，栈大小等。这里不解释
    globVal = 1;
    //初始化锁。
    pthread_mutex_init(&globMut, NULL);

    int a;
    //开线程。
    pthread_create(&tmpfd, NULL, threadTest, &a);
    if(tmpfd < 0)
    {
        //errno是我们系统调用失败时，会将错误保存到errno中。errno是全局变量。
        printf("err:%d, %d\n", (int)tmpfd, errno);
    }
    printf("m1\n");
    while(globVal == 1)
    {
        usleep(1000);
    }
    //锁住，然后处理公共数据，一定要记锁内处理一定要快，不要在中断使用锁，用unlock解锁。
    //避免多锁交叉使用，防止死锁。
    //可以lock1 lock2 unlock2 unlock1;不要lock1 lock2 unlock1 unlock2。
    pthread_mutex_lock(&globMut);
    globVal = 3;
    pthread_mutex_unlock(&globMut);
    printf("m2\n");
    while(globVal == 3)
    {
        usleep(1000);
    }
    printf("m3\n");
    //等待退出线程。
    pthread_join(tmpfd, NULL);
    printf("m4\n");
    return 0;
}